/*
 * Copyright (C), 2005-2018, 上海瑛麒动漫科技有限公司
 * FileName: GsonUtils.java
 * Author:   tianmu
 * Date:     2018年3月7日 下午3:41:55
 * Description: //模块目的、功能描述
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.sfang.common.util.json;

import com.google.gson.*;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Type;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;

/**
 * Gson操作工具<br>
 * 〈功能详细描述〉
 *
 * @author tianmu
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class JsonUtils {

    private final static Gson gson;

    static {
        GsonBuilder gb = new GsonBuilder();
        gb.registerTypeAdapter(Date.class, new DateSerializer()).setDateFormat(DateFormat.LONG);
        gb.registerTypeAdapter(Date.class, new DateDeserializer()).setDateFormat(DateFormat.LONG);
        gson = gb.serializeNulls().enableComplexMapKeySerialization().create();
    }

    /**
     * 功能描述: <br>
     * 把对象转换成JSON字符串
     *
     * @param t
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static <T> String toJson(T t) {
        if (t == null) {
            return null;
        }
        return gson.toJson(t);
    }

    /**
     * 功能描述: <br>
     * 转换字符串成JSON对象
     *
     * @param json
     * @param classOfT
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static <T> T fromJson(String json, Class<T> classOfT) {
        if (StringUtils.isBlank(json)) {
            return null;
        }
        return gson.fromJson(json, classOfT);
    }

    /**
     * 功能描述: <br>
     * 转换字符串成List对象
     *
     * @param json
     * @param typeOfT
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static <T> List<T> fromJson(String json, Type typeOfT) {
        if (StringUtils.isBlank(json)) {
            return null;
        }
        return gson.fromJson(json, typeOfT);
    }

}

class DateDeserializer implements JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        return new Date(json.getAsJsonPrimitive().getAsLong());
    }

}

class DateSerializer implements JsonSerializer<Date> {

    @Override
    public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.getTime());
    }

}
